package com.z.redis.command.impl;

import com.z.redis.RedisCore;
import com.z.redis.command.CommandType;
import com.z.redis.command.WriteCommand;
import com.z.redis.datatype.BytesWrapper;
import com.z.redis.datatype.RedisData;
import com.z.redis.resp.BulkString;
import com.z.redis.resp.Resp;
import com.z.redis.resp.RespInt;
import io.netty.channel.ChannelHandlerContext;

/**
 * ttl命令
 * 当键不存在 返回-2
 * 当键存在但是没有剩余的生存时间 返回-1
 * 当键存在并且有剩余的生存时间 返回剩余的生存时间
 */
public class Ttl implements WriteCommand {
    private BytesWrapper key;

    @Override
    public CommandType type(){
        return CommandType.ttl;
    }

    @Override
    public void setContent(Resp[] array){
        key = ((BulkString)array[1]).getContent(); // 解析键名
    }

    @Override
    public void handle(ChannelHandlerContext ctx, RedisCore redisCore){
        RedisData redisData = redisCore.get(key);
        if(redisData == null){
            ctx.writeAndFlush(new RespInt(-2)); // 键不存在
        }else if(redisData.getTimeout() == -1){
            ctx.writeAndFlush(new RespInt(-1)); // 键存在但是没有剩余的生存时间
        }else {
            long second = (redisData.getTimeout() - System.currentTimeMillis()) / 1000;
            ctx.writeAndFlush(new RespInt((int)second)); // 键存在并且有剩余的生存时间
        }
    }

    @Override
    public void handle(RedisCore redisCore){
        RedisData redisData = redisCore.get(key);
        if(redisData != null){
            if(redisData.getTimeout() != -1){
                long second = (redisData.getTimeout() - System.currentTimeMillis()) / 1000;
            }
        }
    }
}
